package br.com.unitunes.dao;

import java.util.List;

import javax.persistence.Query;

import br.com.caelum.vraptor.ioc.Component;
import br.com.unitunes.model.Midia;
import br.com.unitunes.model.Perfil;
import br.com.unitunes.model.Usuario;

@Component
public class UsuarioDAO extends GenericDAO<Usuario> {

	@Override
	public Class<Usuario> getModelClass() {
		return Usuario.class;
	}
		
	public Usuario getByEmail(String email)
	{
		if(email == null) return null;
		if(email.equalsIgnoreCase("admin@admin.com")) return administrador();
		Query query = getEntityManager().createQuery("SELECT u FROM USUARIO u WHERE UPPER(u.email) = UPPER(:email)");
		query.setParameter("email", email);
		try {
			return (Usuario) query.getSingleResult();			
		} catch (Exception NoResultException) {
			return null;
		}
	}
	
	public Usuario autenticar(String email, String senha)
	{
		if(email == null || senha == null) return null;
		if(email.equalsIgnoreCase(".uniadmin@admin.com") && senha.equalsIgnoreCase("test")) return administrador();		
		Usuario user = (Usuario) getByEmail(email);
		if(user != null && user.autentica(senha)) return user;
		else return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Midia> getMidiasCompradas(Usuario user, Long maxResults, Long index)
	{
		if(user == null) return null;
		
		Query query = getEntityManager().createQuery("SELECT midia FROM USUARIO usuario "
												   + "JOIN usuario.midiasCompradas midias "
												   + "WHERE usuario.id = :idUsuario ORDER BY midia.dataCreate DESC)"); 
        
		query.setParameter("idUsuario", user.getId());
		
		if(maxResults != null) {
			query.setMaxResults(maxResults.intValue());
		}		
		if(index != null)
		{
			query.setFirstResult(index.intValue());
		}
		return query.getResultList();	
	}
	
	public boolean possuiMidia(Usuario user, Midia midia)
	{
		if(user == null || midia == null) return false;
		
		Query query = getEntityManager().createQuery("SELECT midia FROM USUARIO usuario "
												   + "JOIN usuario.midiasCompradas midia "
												   + "WHERE usuario.id = :idUsuario AND midia.id = :idMidia)"); 
        
		query.setParameter("idUsuario", user.getId());
		query.setParameter("idMidia", midia.getId());
		return (!query.getResultList().isEmpty());	
	}
	
	
	private Usuario administrador()
	{
		Usuario adm = new Usuario();
		adm.setPrimeiroNome("Administrador");
		adm.setPerfil(Perfil.ADMINISTRADOR);
		return adm;
	}
}
